不允許 this 隱式定義上下文, 例如以下程式碼
function getLabel(): string {
return this.label.toUpperCase();
}
const config = {
label: 'Hello Typescript World',
getLabel
}
config.getLabel();
稍微粗心大意的人, 如果上面程式碼是用Javascript 會不知道發生甚麼錯誤. 但在Typescript 會告知你
'this' implicitly has type 'any' because it does not have a type annotation.
看出來了嗎? 上面 getLabel() 方法中, this.label 沒有宣告就進行使用 toUpperCase()
所以上面程式碼應該改成如下
const config = {
label: 'Hello Typescript World',
getLabel(): string {
return this.label.toUpperCase();
}
};
但我們最好宣告這是甚麼類型, 最好是明確宣告介面, 更能確保程式碼可讀性, 以及正確性
interface IMyConfig {
label: string;
getLabel: () => string;
}
const config: IMyConfig = {
label: 'Hello Typescript World',
getLabel() {
return this.label.toUpperCase();
}
};
class PlayerInfo {
id: number;
}
function getPlayerInfoById (data: PlayerInfo[], id: number): PlayerInfo {
const player = data.find(x => x.id === id);
return player;
}
Typescript 會提醒以下錯誤訊息
Type 'PlayerInfo | undefined' is not assignable to type 'PlayerInfo'.
Type 'undefined' is not assignable to type 'PlayerInfo'.
此時你就會知道 data.find() 有可能回傳 undefined 值, 所以你得修改程式碼如下
function getPlayerInfoById(data: PlayerInfo[], id: number): PlayerInfo {
const player = data.find(x => x.id === id);
if (player === undefined) {
throw new Error(`Could not find an article with id: ${id}.`)
}
return player;
}
瞧! Typescript 多細心阿!
要在構造函數(constructor)內部初始化, 或在構造之前已定義的類別中的屬性
看看下面的個例子
class Student {
name: string;
}
Typescript 會顯示以下錯誤訊息, 告知 name 屬性沒有初值.
Property 'name' has no initializer and is not definitely assigned in the constructor.
所以在這模式下, 你必須對所有屬性做初始化, 不能甚麼都沒有
class Student {
name: string = "";
}
檢查你正在使用bind, call, apply 在方法中定義的參數類型和數量
以下範例示範 sum 方法
function sum (num1: number, num2: number): number {
return num1 + num2;
}
sum.apply(null, (1, 2, 3));
Typescript 會找出你apply 傳入的參數有錯誤
Argument of type '3' is not assignable to parameter of type '[number, number]'.
Left side of comma operator is unused and has no side effects.
上述程式碼應該修正為
sum.apply(null, [1, 2]);